"""
Alpha 空投代币获取模块

功能：
- 通过 CoinGecko 的 "binance-alpha-spotlight" 分类获取 Alpha 项目代币
- 与币安交易所当前可交易的现货交易对做交集过滤（默认 USDT 计价）
- 返回在币安可交易的 Alpha 代币交易对列表（如 ["TALEUSDT", ...]）

说明：
- 由于币安未提供稳定的 Alpha 空投公共 API，此实现使用 CoinGecko 分类作为权威近似源。
- 若后续需要切换为币安官方接口，可在本模块中替换数据源函数。
"""

from typing import List, Dict
import logging
import requests

from data_fetcher import CryptoDataFetcher


logger = logging.getLogger(__name__)


COINGECKO_ALPHA_CATEGORY_URL = (
    "https://api.coingecko.com/api/v3/coins/markets"
)


def _fetch_coingecko_alpha_tokens(per_page: int = 250, page: int = 1) -> List[Dict]:
    """
    从 CoinGecko 获取 "binance-alpha-spotlight" 分类下的币种条目。

    Args:
        per_page: 每页数量（最多 250）
        page: 页码

    Returns:
        列表，每项为 Coin 条目字典（包含 id、symbol、name 等）
    """
    params = {
        "vs_currency": "usd",
        "category": "binance-alpha-spotlight",
        "per_page": per_page,
        "page": page,
        "order": "market_cap_desc",
        "sparkline": "false",
    }
    try:
        resp = requests.get(COINGECKO_ALPHA_CATEGORY_URL, params=params, timeout=15)
        resp.raise_for_status()
        data = resp.json()
        if not isinstance(data, list):
            logger.warning("CoinGecko 返回的 Alpha 数据格式异常")
            return []
        return data
    except Exception as exc:
        logger.error(f"获取 CoinGecko Alpha 列表失败: {exc}")
        return []


def get_binance_alpha_airdrop_symbols(quote_asset: str = "USDT") -> List[str]:
    """
    获取币安上所有（当前可交易的）Alpha 空投/Spotlight 相关代币的交易对列表。

    实现步骤：
    1) 从 CoinGecko 的 binance-alpha-spotlight 分类拉取代币（最多 250 条）
    2) 将代币 symbol（大写）与币安当前可交易的现货 baseAsset 做交集
    3) 返回匹配到的交易对（默认以 USDT 计价）

    Args:
        quote_asset: 计价货币（默认 "USDT"）

    Returns:
        交易对符号列表（如 ["TALEUSDT", "AVAILUSDT", ...]），已排序
    """
    # 1) 拉取 Alpha 分类代币
    alpha_tokens = _fetch_coingecko_alpha_tokens(per_page=250, page=1)
    if not alpha_tokens:
        return []

    alpha_base_candidates = {str(item.get("symbol", "")).upper() for item in alpha_tokens if item}
    alpha_base_candidates.discard("")

    # 2) 获取币安当前可交易的 base->symbol 映射
    fetcher = CryptoDataFetcher()
    base_to_symbol = fetcher.get_quote_base_map(quote_asset=quote_asset)
    if not base_to_symbol:
        return []

    # 3) 求交集并返回交易对
    matched_bases = sorted(alpha_base_candidates.intersection(set(base_to_symbol.keys())))
    return [base_to_symbol[base] for base in matched_bases]


def get_binance_alpha_airdrop_bases(quote_asset: str = "USDT") -> List[str]:
    """
    获取币安上（当前可交易的）Alpha 空投/Spotlight 相关代币的基础币种列表（BaseAsset）。

    Args:
        quote_asset: 计价货币（默认 "USDT"）

    Returns:
        BaseAsset 列表（如 ["TALE", "AVAIL", ...]），已排序
    """
    symbols = get_binance_alpha_airdrop_symbols(quote_asset=quote_asset)
    if not symbols:
        return []
    return sorted({s.replace(quote_asset, "") for s in symbols})


